core: Actually return an error from fsck
authorColin Walters <walters@verbum.org>
Wed, 9 Nov 2011 13:27:47 +0000 (08:27 -0500)
committerColin Walters <walters@verbum.org>
Wed, 9 Nov 2011 13:27:47 +0000 (08:27 -0500)
And add some tests that fsck reports an error.

ostree/ot-builtin-fsck.c
tests/t0005-corruption.sh [new file with mode: 0755]
tests/t0005-pull.sh [deleted file]
tests/t0010-pull.sh [new file with mode: 0755]

index 7c87402fb8784bad09c974970700f06741f846fd..e0da0dc83a0e340a548f6a842d569813c35793e0 100644 (file)
@@ -35,10 +35,11 @@ static GOptionEntry options[] = {
 
 typedef struct {
   guint n_objects;
-} HtFsckData;
+  gboolean had_error;
+} OtFsckData;
 
 static gboolean
-checksum_packed_file (HtFsckData   *data,
+checksum_packed_file (OtFsckData   *data,
                       const char   *path,
                       GChecksum   **out_checksum,
                       GError      **error)
@@ -111,7 +112,6 @@ checksum_packed_file (HtFsckData   *data,
     g_variant_unref (xattrs);
   return ret;
 }
-                    
 
 static void
 object_iter_callback (OstreeRepo  *repo,
@@ -119,7 +119,7 @@ object_iter_callback (OstreeRepo  *repo,
                       GFileInfo     *file_info,
                       gpointer       user_data)
 {
-  HtFsckData *data = user_data;
+  OtFsckData *data = user_data;
   struct stat stbuf;
   GChecksum *checksum = NULL;
   GError *error = NULL;
@@ -169,6 +169,7 @@ object_iter_callback (OstreeRepo  *repo,
   
   if (strcmp (checksum_string, g_checksum_get_string (checksum)) != 0)
     {
+      data->had_error = TRUE;
       g_printerr ("ERROR: corrupted object '%s' expected checksum: %s\n",
                   path, g_checksum_get_string (checksum));
     }
@@ -193,7 +194,7 @@ gboolean
 ostree_builtin_fsck (int argc, char **argv, const char *repo_path, GError **error)
 {
   GOptionContext *context;
-  HtFsckData data;
+  OtFsckData data;
   gboolean ret = FALSE;
   OstreeRepo *repo = NULL;
 
@@ -204,6 +205,7 @@ ostree_builtin_fsck (int argc, char **argv, const char *repo_path, GError **erro
     goto out;
 
   data.n_objects = 0;
+  data.had_error = FALSE;
 
   repo = ostree_repo_new (repo_path);
   if (!ostree_repo_check (repo, error))
@@ -212,6 +214,12 @@ ostree_builtin_fsck (int argc, char **argv, const char *repo_path, GError **erro
   if (!ostree_repo_iter_objects (repo, object_iter_callback, &data, error))
     goto out;
 
+  if (data.had_error)
+    {
+      g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED,
+                   "Encountered filesystem consistency errors");
+      goto out;
+    }
   if (!quiet)
     g_printerr ("Total Objects: %u\n", data.n_objects);
 
diff --git a/tests/t0005-corruption.sh b/tests/t0005-corruption.sh
new file mode 100755 (executable)
index 0000000..afd5086
--- /dev/null
@@ -0,0 +1,35 @@
+#!/bin/bash
+#
+# Copyright (C) 2011 Colin Walters <walters@verbum.org>
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+#
+# Author: Colin Walters <walters@verbum.org>
+
+set -e
+
+echo "1..1"
+
+. libtest.sh
+
+setup_test_repository "regular"
+$OSTREE checkout test2 checkout-test2
+cd checkout-test2
+chmod o+x firstfile
+$OSTREE fsck -q 2>/dev/null && (echo 1>&2 "fsck unexpectedly succeeded"; exit 1)
+chmod o-x firstfile
+$OSTREE fsck -q
+
+echo "ok chmod"
diff --git a/tests/t0005-pull.sh b/tests/t0005-pull.sh
deleted file mode 100755 (executable)
index 9d33b7e..0000000
+++ /dev/null
@@ -1,33 +0,0 @@
-#!/bin/bash
-#
-# Copyright (C) 2011 Colin Walters <walters@verbum.org>
-#
-# This program is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 2 of the License, or
-# (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software
-# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
-#
-# Author: Colin Walters <walters@verbum.org>
-
-set -e
-
-. libtest.sh
-
-echo '1..1'
-
-setup_fake_remote_repo1
-cd ${test_tmpdir}
-mkdir repo
-$OSTREE init
-$OSTREE remote add origin $(cat httpd-address)/ostree/gnomerepo
-$OSTREE pull origin main
-echo "ok pull"
diff --git a/tests/t0010-pull.sh b/tests/t0010-pull.sh
new file mode 100755 (executable)
index 0000000..9d33b7e
--- /dev/null
@@ -0,0 +1,33 @@
+#!/bin/bash
+#
+# Copyright (C) 2011 Colin Walters <walters@verbum.org>
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+#
+# Author: Colin Walters <walters@verbum.org>
+
+set -e
+
+. libtest.sh
+
+echo '1..1'
+
+setup_fake_remote_repo1
+cd ${test_tmpdir}
+mkdir repo
+$OSTREE init
+$OSTREE remote add origin $(cat httpd-address)/ostree/gnomerepo
+$OSTREE pull origin main
+echo "ok pull"